<?php
namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;

class BaseController extends Controller
{
    public function __construct()
    {
        parent::__construct();
        //共享菜单给全局视图
        $menus = session('menus');
        view()->share(compact('menus'));
    }

    /**
     * 对数据表中的单行或多行记录执行修改 GET参数id为数字或逗号分隔的数字
     *
     * @param string $model 模型名称,依赖注入的model
     * @param array $data 修改的数据
     * @param array $where 查询时的where()方法的参数
     * @param array $msg 执行正确和错误的消息 array('success'=>'','error'=>'', 'url'=>'','ajax'=>false)
     *                     url为跳转页面,ajax是否ajax方式(数字则为倒数计时秒数)
     */
    final protected function editRow($model, $data, $where, $msg)
    {
        $msg = array_merge(['success' => '操作成功！', 'error' => '操作失败！', 'url' => '', 'ajax' => is_ajax()], (array)$msg);
//        dd($where);
        if ($model->_update($where, $data)) {
            if(method_exists($model,'generate')){
                $model->generate();
            }
            return $this->success($msg['success'], $msg['url'], $msg['ajax']);
        }
        return $this->error($msg['error'], $msg['url'], $msg['ajax']);
    }

    /**
     * 禁用条目
     * @param string $model 模型名称,依赖注入的model
     * @param array $where 查询时的 where()方法的参数
     * @param array $msg 执行正确和错误的消息,可以设置四个元素 array('success'=>'','error'=>'', 'url'=>'','ajax'=>false)
     *                     url为跳转页面,ajax是否ajax方式(数字则为倒数计时秒数)
     */
    protected function forbid($model, $where = [], $msg = ['success' => '状态禁用成功！', 'error' => '状态禁用失败！'])
    {
        $data['status'] = 0;
        return $this->editRow($model, $data, $where, $msg);
    }

    /**
     * 恢复条目
     * @param string $model 模型名称,依赖注入的model
     * @param array $where 查询时的where()方法的参数
     * @param array $msg 执行正确和错误的消息 array('success'=>'','error'=>'', 'url'=>'','ajax'=>false)
     *                     url为跳转页面,ajax是否ajax方式(数字则为倒数计时秒数)
     */
    protected function resume($model, $where = [], $msg = ['success' => '状态恢复成功！', 'error' => '状态恢复失败！'])
    {
        $data['status'] = 1;
        return $this->editRow($model, $data, $where, $msg);
    }

    /**
     * 还原条目
     * @param string $model 模型名称,依赖注入的model
     * @param array $where 查询时的where()方法的参数
     * @param array $msg 执行正确和错误的消息 array('success'=>'','error'=>'', 'url'=>'','ajax'=>false)
     *                     url为跳转页面,ajax是否ajax方式(数字则为倒数计时秒数)
     */
    protected function restore($model, $where = [], $msg = ['success' => '状态还原成功！', 'error' => '状态还原失败！'])
    {
        $data['status'] = 1;
        $where['status'] = -1;
        return $this->editRow($model, $data, $where, $msg);
    }

    /**
     * 条目假删除
     * @param string $model 模型名称,供D函数使用的参数
     * @param array $where 查询时的where()方法的参数
     * @param array $msg 执行正确和错误的消息 array('success'=>'','error'=>'', 'url'=>'','ajax'=>false)
     *                     url为跳转页面,ajax是否ajax方式(数字则为倒数计时秒数)
     */
    protected function delete($model, $where = [], $msg = ['success' => '删除成功！', 'error' => '删除失败！'])
    {
        $data['status'] = -1;
        return $this->editRow($model, $data, $where, $msg);
    }

    /**
     * 设置一条或者多条数据的状态
     */
    public function anySetStatus()
    {
        $model = str_replace(request()->route()->getPrefix() . '/', '', '/'.request()->getRelativeUriForPath(request()->path()));
        if (strpos($model,'/')) {
            $tem = explode('/',$model);
            $model = $tem[0];
            if (strpos($model,'-')) {
                $arr = explode('-',$model);
                $model = $arr[0].ucfirst($arr[1]);
            }
        }
        $ids = is_array(request('ids')) ? request('ids') : [request('ids')];
        $status = request('status');
        if (empty($ids)) {
            return $this->error('请选择要操作的数据');
        }
        $where['id'] = ['in', $ids];
        switch ($status) {
            case -1 :
                return $this->delete($this->$model, $where, ['success' => '删除成功', 'error' => '删除失败']);
            case 0  :
                return $this->forbid($this->$model, $where, ['success' => '禁用成功', 'error' => '禁用失败']);
            case 1  :
                return $this->resume($this->$model, $where, ['success' => '启用成功', 'error' => '启用失败']);
            default :
                return $this->error('参数错误');
        }
    }

}